package com.alex.statistics.method.timeSeriesAnalysis;


import org.apache.commons.math3.fitting.PolynomialCurveFitter;
import org.apache.commons.math3.fitting.WeightedObservedPoints;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class PolynomialFitService {

    /**
     * 使用多项式最小二乘法进行拟合并返回系数
     *
     * @param xData x 轴数据（一维列表）
     * @param yData y 轴数据
     * @param degree 多项式的阶数
     * @return 返回拟合后的多项式系数
     */
    public List<Double> fitPolynomial(List<Double> xData, List<Double> yData, int degree) {
        WeightedObservedPoints points = new WeightedObservedPoints();
        int numPoints = xData.size();  // 数据点的数量

        // 将每个 x 数据点添加到 points 中
        for (int i = 0; i < numPoints; i++) {
            // 将每个 x 数据点与对应的 y 数据点加入拟合点集合
            points.add(xData.get(i), yData.get(i));  // 添加到拟合点集合
        }

        // 使用多项式拟合器进行拟合
        PolynomialCurveFitter fitter = PolynomialCurveFitter.create(degree);
        double[] coefficients = fitter.fit(points.toList());

        // 将系数转换为 List<Double>
        List<Double> coefficientsList = new ArrayList<>();
        for (double coefficient : coefficients) {
            coefficientsList.add(coefficient);
        }

        return coefficientsList;
    }
}
